package com.chapter20.demo3;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 *
 * ThreadFactory线程工厂，创建线程：
 * 在Executors类中，每个静态地创建ExecutorService对象的方法都被
 * 重载为可以接受一个ThreadFactory对象作为参数，而这个对象则被用来创建新的线程
 */
public class DaemonThreadFactory {
    public static void main(String[] args) {
        //创建线程
        //lambda表达式：传入Runnable类型参数，实现了ThreadFactory接口的newThread方法
        ExecutorService exec = Executors.newCachedThreadPool(r->{
            Thread t = new Thread(r);
            //线程工厂创建的线程都是后台线程（守护线程）
            t.setDaemon(true);
            return t;
        });

        //lambda表达式：实现了Runnable接口的run方法
        Runnable task = ()->
                System.out.println(Thread.currentThread().getName());


        //提交5个任务
        for (int i=0;i<5;i++){
            // ExecutorService的submit方法提交Runnable任务或者Callable任务，可提交多个。
            exec.submit(task);
        }

        try {
            //为了能够看到子线程输出的结果，我们调用ExecutorService的awaitTermination方法，让主线程等待100毫秒。也正因为在线程池中
            //都是后台线程，所以不用调用ExecutorService的shutdown方法来进行关闭。
            exec.awaitTermination(1000, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
